package com.basker.pisces.core.resource;

import java.io.IOException;
import java.util.function.Predicate;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.ResourcePatternResolver;

import com.basker.pisces.core.resource.annotation.ResouceLoader;

/**
 * 所有实现该接口的、并且是<b>springbean</b>的实例，用被{@link ResourceLoaderManager}所识别并调用
 *
 * @author hangwen
 */
public interface IResourceLoader {

    /**
     * {@link #getLocationPatterns()}扫描后的资源可以通过该方法返回的过滤器过滤
     *
     * @return
     */
    default Predicate<Resource> getFilter() {
        return null;
    }

    /**
     * 获取资源的路径，该方法的返回值会交给{@link ResourcePatternResolver#getResources(String)}方法来加载具体资源，
     * 默认返回{@link ResouceLoader#locationPatterns()}，重写方法会忽略注解的值
     *
     * @return
     */
    default String[] getLocationPatterns() {
        ResouceLoader ar = this.getClass().getAnnotation(ResouceLoader.class);
        if (ar == null) {
            return null;
        }

        return ar.locationPatterns();
    }

    /**
     * 加载的优先级，大的优先加载，null表示0，默认返回{@link ResouceLoader#priority()}，重写方法会忽略注解的值
     *
     * @return
     */
    default Integer getPriority() {
        ResouceLoader ar = this.getClass().getAnnotation(ResouceLoader.class);
        if (ar == null) {
            return 0;
        }

        return ar.priority();
    }

    /**
     * 处理找到的资源,如果找不到也会调用该方法，参数是一个空数组
     *
     * @param resources
     * @throws IOException
     */
    void load(Resource[] resources) throws IOException;

}
